iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
Cloud Native

K8s上的機器人沙盒系列 第 2

Day 2|用 kubeadm + containerd 建一套最小 K8S

  • 分享至 

  • xImage
  •  

目標:從零建立一個 1 控制節點(control plane)+ 1 台 GPU 工作節點(worker) 的最小可用叢集,為之後的 CNI(Day 3)與 GPU Operator(Day 4)鋪路。


拓樸與命名

  • 節點與主機名(可自行替換):

    • 控制平面:cp1 192.168.27.10
    • GPU 工作節點:gpu01 192.168.27.11(8× NVIDIA GPU)
  • 內部網段:192.168.27.0/24

  • 叢集 CIDR(kubeadm 預設 ServiceCIDR 保持不動):

    • Pod CIDR:10.244.0.0/16(Day 3 會裝 Cilium,這個範圍相容)
    • Service CIDR:預設 10.96.0.0/12

提醒:若你已規劃了不同的內網與 CIDR,本文中的參數請相應替換。


作業系統前置(兩台節點都要)

下列指令以 Ubuntu 22.04/24.04Rocky/Alma 9 為例,兩類系統擇一執行。

1) 基本設定(時間、Swap、核心參數)

通用(Ubuntu / RHEL 系):

# 建議設時區,便於排錯
sudo timedatectl set-timezone Asia/Taipei

# 關閉 swap(K8s 要求)
sudo swapoff -a
sudo sed -i '/\sswap\s/d' /etc/fstab

# 載入必要模組
echo -e 'overlay\nbr_netfilter' | sudo tee /etc/modules-load.d/containerd.conf
sudo modprobe overlay && sudo modprobe br_netfilter

# K8s 需要的 sysctl
cat <<'EOF' | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

# 設主機名(請依實機分別在 cp1 / gpu01 上執行)
# 例:在控制平面
#   sudo hostnamectl set-hostname cp1
# 在工作節點
#   sudo hostnamectl set-hostname gpu01

# /etc/hosts(兩台都加對方):
# 192.168.27.10  cp1
# 192.168.27.11  gpu01

2) 安裝 containerd(CRI)

Ubuntu

sudo apt-get update
sudo apt-get install -y containerd

# 生成並調整預設設定(啟用 systemd cgroup)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

sudo systemctl enable --now containerd

Rocky/Alma 9

sudo dnf install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl enable --now containerd

之後我們會用 GPU Operator 來處理 GPU Runtime 與 Driver(Day 4)。若你要先自驗實體 GPU 狀態,可以暫時在 gpu01 安裝 NVIDIA 驅動,並確認 nvidia-smi 可正常列出 8 張卡。

3) 防火牆放行(建議)

控制平面 cp1 需入站放行:6443/tcp10250/tcp10257/tcp10259/tcp

工作節點 gpu01 需入站放行:10250/tcp

範例:

  • Ubuntu(UFW):

    # cp1
    sudo ufw allow 6443/tcp && sudo ufw allow 10250/tcp && \
    sudo ufw allow 10257/tcp && sudo ufw allow 10259/tcp
    # gpu01
    sudo ufw allow 10250/tcp
    
  • Rocky/Alma(firewalld):

    # cp1
    sudo firewall-cmd --permanent --add-port=6443/tcp
    sudo firewall-cmd --permanent --add-port=10250/tcp
    sudo firewall-cmd --permanent --add-port=10257/tcp
    sudo firewall-cmd --permanent --add-port=10259/tcp
    sudo firewall-cmd --reload
    # gpu01
    sudo firewall-cmd --permanent --add-port=10250/tcp
    sudo firewall-cmd --reload
    

叢集內部 Pod/Node 之間通訊會在 Day 3 安裝 CNI 後啟用;此處先確保控制面的必要連線無阻。


安裝 kubeadm / kubelet / kubectl(兩台節點都要)

本文以 Kubernetes v1.34pkgs.k8s.io 社群套件庫為例,其他小版號請替換 URL 中的版本字串。

Ubuntu

sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

Rocky/Alma 9

sudo tee /etc/yum.repos.d/kubernetes.repo > /dev/null <<'EOF'
[kubernetes]
name=Kubernetes v1.34
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
EOF

sudo dnf install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

初始化控制平面(只在 cp1

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16

初始化成功後,畫面會輸出一段 kubeadm join ... 指令(含 token 與 CA 資訊)。請複製保存,待會要到 gpu01 上加入叢集。

設定 kubectl:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 驗證(此時因尚未裝 CNI,Node 會是 NotReady 屬正常)
kubectl get nodes -o wide
kubectl get pods -A

若你之後會遠端操作,也可以把 $HOME/.kube/config 複製到你的工作站。


工作節點加入叢集(只在 gpu01

gpu01 上執行從 cp1 複製來的 join 指令,例如:

sudo kubeadm join 192.168.27.10:6443 \
  --token <your-token> \
  --discovery-token-ca-cert-hash sha256:<your-hash>

回到 cp1 檢查:

kubectl get nodes -o wide

出現 cp1gpu01 兩台節點即表示完成基本骨架。Node 仍可能顯示 NotReady(因為 CNI 尚未部署),這會在 Day 3 裝 Cilium 後轉為 Ready。


(選做)GPU 主機基本健檢

Day 4 會透過 NVIDIA GPU Operator 部署驅動與 Container Toolkit;若你想先確認實體 GPU 狀態,可在 gpu01 上:

# 實體層檢查(需已安裝 NVIDIA 驅動)
nvidia-smi

# 溫度、風扇、ECC(若支援)等可一併確認
nvidia-smi -q | less

若你的環境 必須 由 GPU Operator 安裝驅動(不想預先裝 Driver),請先確保 BIOS 關閉 Secure Boot,並讓節點具備 kernel headers 與必要建置工具;這些會在 Day 4 詳述。


常見問題排查

  • kubeadm init 卡在 preflight:確認 swapoffbr_netfilterip_forward=1 已生效。

  • Worker 加入時憑證錯誤:重新在控制面產生 token:

    kubeadm token create --print-join-command
    
  • 防火牆封鎖:確定控制面/工作節點必要連接埠已放行;另外,CNI 安裝後還需要節點間 L3 連通(Day 3 會處理)。

  • 節點長期 NotReady:CNI 尚未安裝或未正常啟動;等 Day 3。


今日小結

你已完成:

  1. 關閉 swap、調好 sysctl、安裝並設定 containerd(systemd cgroup)。
  2. 在兩台節點安裝 kubeadm / kubelet / kubectl
  3. kubeadm init 建立控制平面,並以 kubeadm join 納入 八 GPU 的 gpu01

最後までご視聴ありがとうございました


上一篇
Day 1|簡介:在 K8s 打造機器人沙盒
系列文
K8s上的機器人沙盒2
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言